package factory

// 提供者工程方法
import (
	"bookstore/store"
	"fmt"
	"sync"
)

var (
	providersMu sync.RWMutex
	providers   = make(map[string]store.Store)
)

// 注册提供者
func Register(name string, p store.Store) {
	providersMu.Lock()
	defer providersMu.Unlock()

	if p == nil {
		panic("provider 不能为 nil")
	}

	if _, dup := providers[name]; dup {
		panic("provider 名字重复")
	}

	providers[name] = p
}

// 得到一个提供者
func New(name string) (store.Store, error) {
	providersMu.Lock()
	defer providersMu.Unlock()

	p, ok := providers[name]

	if !ok {
		return nil, fmt.Errorf("不存在该provider: %s", name)
	}

	return p, nil
}
